/*
	实现3个goroutine之间消息传递
	 G1 将0-9传递给 G2
	 G2 将读到的数据平方后传递给 G3
	 G3 将读到的数据打印到屏幕
	思考：
		需要几个channel？ 2
		需要几个Goroutine？3
	channel关闭应该由谁来关闭？肯定要由写方关闭！
	关闭后，不能再写，读会怎么样？最后一次读到数据后，如果已经关闭，再读将会获取一个关闭的消息
	需要使用指示器来获取
*/
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func main() {
	//创建2个channel
	ch1 := make(chan int)
	ch2 := make(chan int)
	//创建3个goroutine
	wg.Add(2)
	//借助一个知识点： channel关闭 10:25
	//counter
	go func() {
		for i := 0; i < 10; i++ {
			ch1 <- i
			time.Sleep(time.Second)
		}
		close(ch1)
		wg.Done()
	}()
	//squarer
	go func() {
		for {
			num, ok := <-ch1 //ok代表指示器，指示channel是否关闭
			if !ok {
				//代表已经关闭
				break
			}
			ch2 <- num * num
		}
		close(ch2)
		wg.Done()
	}()
	//printer
	for {
		num, ok := <-ch2
		if !ok {
			//代表已经关闭
			break
		}
		fmt.Println(num)
	}
	wg.Wait()
}
